package com.example.articletest.Service.Impl;

import com.example.articletest.Dao.CommentDao;
import com.example.articletest.POJO.Comment;
import com.example.articletest.Service.CommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CommentServiceImpl implements CommentService {
    //注入dao
    @Autowired
    private CommentDao commentDao;

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 保存一个评论
     * @param comment
     */
    public void saveComment(Comment comment){
        //如果需要自定义主键，可以在这里指定主键；如果不指定主键，MongoDB会自动生成主键
        //设置一些默认初始值。。。
        //调用dao---方法名特殊要求必须是save
        commentDao.save(comment);
    }

    /**
     * 更新评论
     * @param comment
     */
    public void updateComment(Comment comment){
        //调用dao
        commentDao.save(comment);
    }


    /**
     * 根据id删除评论
     * @param id
     */
    public void deleteCommentById(String id){
        //调用dao
        commentDao.deleteById(id);
    }

    /**
     * 查询所有评论
     * @return
     */
    public List<Comment> findCommentList(){
        //调用dao
        return commentDao.findAll();
    }

    /**
     * 根据id查询评论
     * @param id
     * @return
     */
    public Comment findCommentById(String id) {
        //调用dao
        return commentDao.findById(id).get();

    }

    /**
     * 分页查询评论---必须参数：pagePageable--使用PageRequest.of(0, 2)构造
     */
    // Service 调用
    public Page<Comment> page(){
        return commentDao.findByUserid("1003",
                // 参数说明：
                // 0       : 页码（从0开始计数）
                // 2      : 每页数据量
                // Sort.by : 排序构造器---按照某个属性排序查询--属性名必须与POJO中的属性名完全一致
                // descending() : 降序排序
                PageRequest.of(0, 2, Sort.by("createtime").descending()));
    }

    /**
     * 分页查询的同时排序--通过方法名生成带排序的查询语句--不用显示的指定排序
     */
    public Page<Comment> pageSort(){
        return commentDao.findByArticleidOrderByCreatedatetimeDesc("1003",
                PageRequest.of(0, 2));

    }

    /**
     *  根据父id，分页查询查询子评论---对应POJO中parentid字段---和上面的都一样
     */
    public Page<Comment> pageByParentid(String parentid,int page,int size){
        return commentDao.findByParentid(parentid,
                PageRequest.of(page-1, size, Sort.by("createtime").descending()));
    }



    /**
     * 使用mongoTemplate自定义查询---相当于自定义写sql语句
     * 点赞数+1
     * @param id
     */
    public void updateCommentLikenum(String id){
        // 1. 创建查询条件：相当于sql的WHERE _id = 参数id
        Query query= Query.query(Criteria.where("_id").is(id));
        // 2. 创建更新操作对象
        Update update=new Update();
        //局部更新，相当于$set--指定某个列的值，然后修改为新值，相当他UPDATE comments SET content = '新内容'
            //update.set("content", "新内容");
        //递增$inc--相当于sql的update table set likenum=likenum+2
        //即令likenum的值自增2，如果不指定值，默认为1
            //update.inc("likenum",2);
        //默认自增1
        update.inc("likenum");


        //参数1：查询对象
        //参数2：更新对象
        //参数3：集合的名字或实体类的类型Comment.class
        /**
         * updateFirst 方法--将上面的查询条件和更新操作应用于集合中的第一个匹配文档。
         * 相当于两个sql拼接到一起
         * 相当于sql：UPDATE comments SET likenum = likenum + 1 WHERE _id = ?
         * 并且updateFirst这个方法名规定了只更新第一个匹配的文档（行）--相当于sql中的limit 1
         * 所以最终相当于sql：UPDATE comments SET likenum = likenum + 1 WHERE _id =? limit 1
         */
        mongoTemplate.updateFirst(query,update,"comment");
    }

}
